Add -Wall for gcc.
authorOwen Taylor <otaylor@redhat.com>
Sun, 9 Jul 2000 22:18:21 +0000 (22:18 +0000)
committerOwen Taylor <otaylor@src.gnome.org>
Sun, 9 Jul 2000 22:18:21 +0000 (22:18 +0000)
Sun Jul  9 18:15:58 2000  Owen Taylor  <otaylor@redhat.com>

* configure.in (ACLOCAL): Add -Wall for gcc.

* src/pixbuf-render.c (pixbuf_render): Fix problem
using gdk_rectangle_intersect() from GTK+-1.2.

* src/pixbuf-render.c src/pixbuf-draw.c: Remove
direct access to pixbuf internals.

modules/engines/pixbuf/ChangeLog
modules/engines/pixbuf/Makefile.am
modules/engines/pixbuf/pixbuf-draw.c
modules/engines/pixbuf/pixbuf-render.c

index 7ac15fc565acabf524c91aca793d749648944953..cd5d93ced721dd58bcaf20bebef4532544a8cd4c 100644 (file)
@@ -1,3 +1,13 @@
+Sun Jul  9 18:15:58 2000  Owen Taylor  <otaylor@redhat.com>
+
+       * configure.in (ACLOCAL): Add -Wall for gcc.
+
+       * src/pixbuf-render.c (pixbuf_render): Fix problem
+       using gdk_rectangle_intersect() from GTK+-1.2.
+
+       * src/pixbuf-render.c src/pixbuf-draw.c: Remove 
+       direct access to pixbuf internals.
+
 Mon Mar  6 11:44:58 2000  Owen Taylor  <otaylor@redhat.com>
 
         * docs/gap-geometry.fig: Moved into docs/ subdir
index 379aaed3ea74b380165a0540472d19180cbf5ab4..7169c0dd2953961351118acbf5a5d7ebb8470748 100644 (file)
@@ -11,4 +11,4 @@ libpixmap_la_SOURCES =                \
        pixbuf.h
 
 libpixmap_la_LDFLAGS = -module -avoid-version
-libpixmap_la_LIBADD =
+libpixmap_la_LIBADD = -lgdk_pixbuf
index d2276ef8e5982df920b1fd6363eacef7c8a3ea3b..bdcf4fc31ad762a96dfaebedfc8f5d226d6b6d3e 100644 (file)
  * Carsten Haitzler <raster@rasterman.com>
  */
 
-#include "pixbuf.h"
 #include <math.h>
+#include <string.h>
+
+#include "pixbuf.h"
 
 static ThemeImage *
 match_theme_image(GtkStyle       *style,
@@ -124,7 +126,7 @@ draw_simple_image(GtkStyle       *style,
              gdk_window_get_type (window) != GDK_WINDOW_PIXMAP)
            {
              GdkPixbuf *pixbuf = theme_pixbuf_get_pixbuf (image->background);
-             if (pixbuf && pixbuf->art_pixbuf->has_alpha)
+             if (pixbuf && gdk_pixbuf_get_has_alpha (pixbuf))
                mask = gdk_pixmap_new (window, width, height, 1);
            }
          
@@ -208,7 +210,7 @@ draw_gap_image(GtkStyle       *style,
        {
        case GTK_POS_TOP:
          if (pixbuf)
-           thickness = pixbuf->art_pixbuf->height;
+           thickness = gdk_pixbuf_get_height (pixbuf);
          else
            thickness = style->klass->ythickness;
          
@@ -231,7 +233,7 @@ draw_gap_image(GtkStyle       *style,
          
        case GTK_POS_BOTTOM:
          if (pixbuf)
-           thickness = pixbuf->art_pixbuf->height;
+           thickness = gdk_pixbuf_get_height (pixbuf);
          else
            thickness = style->klass->ythickness;
 
@@ -254,7 +256,7 @@ draw_gap_image(GtkStyle       *style,
          
        case GTK_POS_LEFT:
          if (pixbuf)
-           thickness = pixbuf->art_pixbuf->width;
+           thickness = gdk_pixbuf_get_width (pixbuf);
          else
            thickness = style->klass->xthickness;
 
@@ -277,7 +279,7 @@ draw_gap_image(GtkStyle       *style,
          
        case GTK_POS_RIGHT:
          if (pixbuf)
-           thickness = pixbuf->art_pixbuf->width;
+           thickness = gdk_pixbuf_get_width (pixbuf);
          else
            thickness = style->klass->xthickness;
 
index d3550456e07cd70e6709732c4debea02382158a4..c2f8cf4a202a14b997e875dba857e11b2c0f3198 100644 (file)
 
 GCache *pixbuf_cache = NULL;
 
+/* Scale the rectangle (src_x, src_y, src_width, src_height)
+ * onto the rectangle (dest_x, dest_y, dest_width, dest_height)
+ * of the destination, clip by clip_rect and render
+ */
 static void
 pixbuf_render (GdkPixbuf    *src,
               GdkWindow    *window,
@@ -42,6 +46,9 @@ pixbuf_render (GdkPixbuf    *src,
   GdkPixbuf *tmp_pixbuf;
   GdkRectangle rect;
   int x_offset, y_offset;
+  gboolean has_alpha = gdk_pixbuf_get_has_alpha (src);
+  gint src_rowstride = gdk_pixbuf_get_rowstride (src);
+  gint src_n_channels = gdk_pixbuf_get_n_channels (src);
 
   if (dest_width <= 0 || dest_height <= 0)
     return;
@@ -51,45 +58,53 @@ pixbuf_render (GdkPixbuf    *src,
   rect.width = dest_width;
   rect.height = dest_height;
 
-  /* FIXME: we need the full mask, not a partial mask; the following is, however,
-   *  horribly expensive
+  /* FIXME: Because we use the mask to shape windows, we don't use
+   * clip_rect to clip what we draw to the mask, only to clip
+   * what we actually draw. But this leads to the horrible ineffiency
+   * of scale the whole image to get a little bit of it.
    */
-  if (!mask && clip_rect && !gdk_rectangle_intersect (clip_rect, &rect, &rect))
-    return;
+  if (!mask && clip_rect)
+    {
+      /* The temporary is necessary only for GDK+-1.2, and not
+       * for later versions of GDK, where you can have the
+       * same source and dest for gdk_rectangle_intersect().
+       */
+      GdkRectangle tmp_rect = rect;
+      
+      if (!gdk_rectangle_intersect (clip_rect, &tmp_rect, &rect))
+       return;
+    }
   
-  if (dest_width != src->art_pixbuf->width ||
-      dest_height != src->art_pixbuf->height)
+  if (dest_width != src_width ||
+      dest_height != src_height)
     {
-      ArtPixBuf *partial_src_art;
-      GdkPixbuf *partial_src_gdk;
-
-      if (src->art_pixbuf->n_channels == 3)
-       {
-         partial_src_art = 
-           art_pixbuf_new_const_rgb (src->art_pixbuf->pixels + src_y * src->art_pixbuf->rowstride + src_x * src->art_pixbuf->n_channels,
-                                     src_width, 
-                                     src_height, 
-                                     src->art_pixbuf->rowstride);
-       }
-      else
-       {
-         partial_src_art = 
-           art_pixbuf_new_const_rgba (src->art_pixbuf->pixels + src_y * src->art_pixbuf->rowstride + src_x * src->art_pixbuf->n_channels,
-                                      src_width, 
-                                      src_height, 
-                                      src->art_pixbuf->rowstride);
-       }
-
-      partial_src_gdk = gdk_pixbuf_new_from_art_pixbuf (partial_src_art);
-      tmp_pixbuf = gdk_pixbuf_new (ART_PIX_RGB, src->art_pixbuf->has_alpha, 8, rect.width, rect.height);
-
-      gdk_pixbuf_scale (partial_src_gdk, tmp_pixbuf, 0, 0, rect.width, rect.height,
+      double x_scale = (double)dest_width / src_width;
+      double y_scale = (double)dest_height / src_height;
+      guchar *pixels;
+      GdkPixbuf *partial_src;
+      
+      pixels = (gdk_pixbuf_get_pixels (src)
+               + src_y * src_rowstride
+               + src_x * src_n_channels);
+
+      partial_src = gdk_pixbuf_new_from_data (pixels, GDK_COLORSPACE_RGB,
+                                             has_alpha,
+                                             8, src_width, src_height,
+                                             src_rowstride,
+                                             NULL, NULL);
+                                                 
+      tmp_pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB,
+                                  has_alpha, 8,
+                                  rect.width, rect.height);
+
+      gdk_pixbuf_scale (partial_src, tmp_pixbuf,
+                       0, 0, rect.width, rect.height,
                        dest_x - rect.x, dest_y - rect.y, 
-                       (double)dest_width / src_width, (double)dest_height / src_height,
-                       ART_FILTER_BILINEAR);
+                       x_scale, y_scale,
+                       GDK_INTERP_BILINEAR);
+
+      gdk_pixbuf_unref (partial_src);
 
-      gdk_pixbuf_unref (partial_src_gdk);
-      
       x_offset = 0;
       y_offset = 0;
     }
@@ -113,6 +128,9 @@ pixbuf_render (GdkPixbuf    *src,
                                         128);
 
       tmp_gc = gdk_gc_new (window);
+      if (clip_rect)
+       gdk_gc_set_clip_rectangle (tmp_gc, clip_rect);
+         
       gdk_pixbuf_render_to_drawable (tmp_pixbuf, window, tmp_gc, 
                                     x_offset, y_offset,
                                     rect.x, rect.y,
@@ -233,6 +251,8 @@ theme_pixbuf_render (ThemePixbuf  *theme_pb,
 {
   GdkPixbuf *pixbuf = theme_pixbuf_get_pixbuf (theme_pb);
   gint src_x[4], src_y[4], dest_x[4], dest_y[4];
+  gint pixbuf_width = gdk_pixbuf_get_width (pixbuf);
+  gint pixbuf_height = gdk_pixbuf_get_height (pixbuf);
 
   if (!pixbuf)
     return;
@@ -241,13 +261,13 @@ theme_pixbuf_render (ThemePixbuf  *theme_pb,
     {
       src_x[0] = 0;
       src_x[1] = theme_pb->border_left;
-      src_x[2] = pixbuf->art_pixbuf->width - theme_pb->border_right;
-      src_x[3] = pixbuf->art_pixbuf->width;
+      src_x[2] = pixbuf_width - theme_pb->border_right;
+      src_x[3] = pixbuf_width;
       
       src_y[0] = 0;
       src_y[1] = theme_pb->border_top;
-      src_y[2] = pixbuf->art_pixbuf->height - theme_pb->border_bottom;
-      src_y[3] = pixbuf->art_pixbuf->height;
+      src_y[2] = pixbuf_height - theme_pb->border_bottom;
+      src_y[3] = pixbuf_height;
       
       dest_x[0] = x;
       dest_x[1] = x + theme_pb->border_left;
@@ -300,14 +320,14 @@ theme_pixbuf_render (ThemePixbuf  *theme_pb,
     {
       if (center)
        {
-         x += (width - pixbuf->art_pixbuf->width) / 2;
-         y += (height - pixbuf->art_pixbuf->height) / 2;
+         x += (width - pixbuf_width) / 2;
+         y += (height - pixbuf_height) / 2;
          
          pixbuf_render (pixbuf, window, NULL, clip_rect,
                         0, 0,
-                        pixbuf->art_pixbuf->width, pixbuf->art_pixbuf->height,
+                        pixbuf_width, pixbuf_height,
                         x, y,
-                        pixbuf->art_pixbuf->width, pixbuf->art_pixbuf->height);
+                        pixbuf_width, pixbuf_height);
        }
       else
        {
@@ -316,14 +336,14 @@ theme_pixbuf_render (ThemePixbuf  *theme_pb,
          GdkGCValues gc_values;
 
          tmp_pixmap = gdk_pixmap_new (window,
-                                      pixbuf->art_pixbuf->width,
-                                      pixbuf->art_pixbuf->height,
+                                      pixbuf_width,
+                                      pixbuf_height,
                                       -1);
          tmp_gc = gdk_gc_new (tmp_pixmap);
          gdk_pixbuf_render_to_drawable (pixbuf, tmp_pixmap, tmp_gc,
                                         0, 0, 
                                         0, 0,
-                                        pixbuf->art_pixbuf->width, pixbuf->art_pixbuf->height,
+                                        pixbuf_width, pixbuf_height,
                                         GDK_RGB_DITHER_NORMAL,
                                         0, 0);
          gdk_gc_unref (tmp_gc);